package com.luguokong.pet_rescue.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.Map;

/**
* Jwt Token 生成的工具类
* @author 10wen
* @date 2022/10/10
*/

public class JwtUtil {

    /**
     * 有效期
     */
    public static long expireTime = 1000 * 60 * 60 * 24 * 7; // 7天

    /**
     * 签名密钥
     */
    public static String secret = "10wen_petRescue";

    /**
     * token 前缀
     */
    public static String tokenPrefix = "Bearer ";

    /**
     * 设置 token 有效时间
     * @param expireTime token 有效时间
     */
    public void setExpireTime(int expireTime) {
        JwtUtil.expireTime = expireTime;
    }

    /**
     * 设置 token 密钥
     * @param secret token 密钥
     */
    public void setSecret(String secret) {
        JwtUtil.secret = secret;
    }

    /**
     * 创建 TOKEN
     * JWT 构成: header, payload, signature
     * @param map jwt payload Map
     * @return token 值
     */
    public static String createToken(Map<String,String> map) {
        // Header 选择默认
        JWTCreator.Builder builder = JWT.create();
        // Payload
        map.forEach((key,value)->{
            builder.withClaim(key,value);
        });
        String TOKEN = builder.withExpiresAt(new Date(System.currentTimeMillis() + expireTime))
                .sign(Algorithm.HMAC256(secret)); // Signature

        return tokenPrefix + TOKEN; // 添加token前缀
    }

    /**
     * 验证 token
     * @param token 验证的 token 值
     * @return DecodedJWT 解码后的 jwt令牌对象
     */
    public static DecodedJWT validateToken(String token) throws Exception {
        // 创建验证对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
        // 去除 token 前缀 "Bearer "
        String noPrefixToken = token.replace(tokenPrefix, "");
        // 得到解码token对象
        DecodedJWT decodedJwt = jwtVerifier.verify(noPrefixToken);
        return decodedJwt;
    }
}
